cmake_minimum_required(VERSION 3.22 FATAL_ERROR)
project(
    GaussianBlueNoise
    VERSION 1.0.0
    DESCRIPTION "CUDA Implementation of Gaussian Blue Noise Sampling (GBN)"
    LANGUAGES CXX CUDA
)
# 强制指定 64位架构（x86_64）
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
    set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -m64") # CUDA 编译强制 64位
else()
    message(FATAL_ERROR "当前仅支持 x86_64 64位架构，不支持 32位")
endif()

# ##############################################################################
# 定义与 main.cpp 对应的 CMake 命令行选项（默认值与 printUsage 一致，消除类型转换警告）
# 格式：-DGBN_NUM_POINTS=4096（编译时传递，覆盖默认值）
# 适配 CMake 3.22 特性：用“临时变量过渡”替代冗余的 INT:/FLOAT: 前缀，避免类型隐性转换
# ##############################################################################
# -------------------------- 第一步：定义纯数值临时变量（自动识别类型） --------------------------
# -n: 点数量（INT 类型，无小数点，CMake 自动识别为整数）
set(GBN_NUM_POINTS 4096)
# -d: 维度（INT 类型，范围 1~32，纯整数赋值）
set(GBN_DIMENSIONS 2)
# -w: 2D域宽度（FLOAT 类型，带小数点，CMake 自动识别为浮点数）
set(GBN_2D_WIDTH 100.0)
# -h: 2D域高度（FLOAT 类型，带小数点，确保浮点类型）
set(GBN_2D_HEIGHT 100.0)
# -s: 高斯核带宽（FLOAT 类型，小数赋值，避免整数隐性转浮点）
set(GBN_SIGMA 1.0)
# -lr: 学习率（FLOAT 类型，小数值，保证浮点精度）
set(GBN_LEARNING_RATE 0.1)
# -i: 最大迭代次数（INT 类型，纯整数，无小数点）
set(GBN_MAX_ITERATIONS 10000)
# -bins: 功率谱区间数（INT 类型，纯整数赋值）
set(GBN_POWER_BINS 100)

# 参数合法性校验（CMake阶段提前拦截无效值，避免编译后运行错误）
if(${GBN_NUM_POINTS} LESS_EQUAL  0)
    message(FATAL_ERROR "GBN_NUM_POINTS 必须为正数（当前: ${GBN_NUM_POINTS}，对应 -n 参数）")
endif()
if(${GBN_DIMENSIONS} LESS 1 OR ${GBN_DIMENSIONS} GREATER 32)
    message(FATAL_ERROR "GBN_DIMENSIONS 必须在1~32之间（当前: ${GBN_DIMENSIONS}，对应 -d 参数）")
endif()
if(${GBN_2D_WIDTH} LESS_EQUAL  0 OR ${GBN_2D_HEIGHT} LESS_EQUAL  0)
    message(FATAL_ERROR "2D域宽/高必须为正数（当前: 宽=${GBN_2D_WIDTH}, 高=${GBN_2D_HEIGHT}，对应 -w/-h 参数）")
endif()
if(${GBN_SIGMA} LESS_EQUAL  0)
    message(FATAL_ERROR "GBN_SIGMA 必须为正数（当前: ${GBN_SIGMA}，对应 -s 参数）")
endif()
if(${GBN_LEARNING_RATE} LESS_EQUAL  0)
    message(FATAL_ERROR "GBN_LEARNING_RATE 必须为正数（当前: ${GBN_LEARNING_RATE}，对应 -lr 参数）")
endif()
if(${GBN_MAX_ITERATIONS} LESS_EQUAL  0)
    message(FATAL_ERROR "GBN_MAX_ITERATIONS 必须为正数（当前: ${GBN_MAX_ITERATIONS}，对应 -i 参数）")
endif()
if(${GBN_POWER_BINS} LESS_EQUAL  0)
    message(FATAL_ERROR "GBN_POWER_BINS 必须为正数（当前: ${GBN_POWER_BINS}，对应 -bins 参数）")
endif()

# ##############################################################################
# 基础配置：C++/CUDA 标准与编译选项（保持不变）
# ##############################################################################
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_EXTENSIONS OFF)

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(GBN_COMPILE_FLAGS 
        -g                  # 生成调试信息
        -O0                 # 关闭优化（便于调试）
        -Wall               # 开启所有警告
        -Wextra             # 开启额外警告
        -Wno-unused-parameter # 忽略CUDA核函数未使用参数警告
    )
else()
    set(GBN_COMPILE_FLAGS 
        -O3                 # 最高优化级别
        -ffast-math         # 快速数学运算（提升高斯核效率）
        -Wall 
        -Wextra 
        -Werror             # 警告视为错误（确保代码健壮性）
    )
endif()

# ##############################################################################
# CUDA 架构自动检测与配置（保持不变）
# ##############################################################################
function(detect_cuda_archs OUT_ARCHS)
    if(NOT CUDA_FOUND)
        set(${OUT_ARCHS} "" PARENT_SCOPE)
        return()
    endif()

    execute_process(
        COMMAND ${CMAKE_CUDA_COMPILER} --list-gpu-archs
        OUTPUT_VARIABLE NVCC_GPU_ARCHS
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )

    if(NVCC_GPU_ARCHS)
        string(REGEX MATCHALL "sm_[0-9]+" CUDA_ARCHS ${NVCC_GPU_ARCHS})
        list(REMOVE_DUPLICATES CUDA_ARCHS)
    else()
        set(CUDA_ARCHS sm_75 sm_80 sm_86 sm_90) # 兼容主流GPU
    endif()

    message(STATUS "Detected CUDA Architectures: ${CUDA_ARCHS}")
    set(${OUT_ARCHS} ${CUDA_ARCHS} PARENT_SCOPE)
endfunction()

detect_cuda_archs(CUDA_ARCHS)
set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCHS})

# ##############################################################################
# 第一步：先创建可执行目标（关键！修复原代码顺序错误，确保 target_* 指令生效）
# ##############################################################################
set(GBN_CUDA_SOURCES
    src/gbn_base_cuda.cu 
    src/gbn_cuda.cu       # CUDA 核函数实现
)

set(GBN_CXX_SOURCES
    src/main.cpp          # 测试入口（需包含 OpenCV 可视化代码）
)

set(GBN_HEADERS
    include/gbn_base_cuda.cuh          # 基础点集声明与数据结构
    include/gbn_cuda.cuh               # GBN 点集声明与数据结构
)

# 创建 gbn_cuda 目标（后续所有依赖配置均基于此目标）
add_executable(gbn_cuda 
    ${GBN_CUDA_SOURCES} 
    ${GBN_CXX_SOURCES} 
    ${GBN_HEADERS}      # 头文件加入目标，便于 IDE 识别（如 VS Code、CLion）
)

# 设置目标属性（CUDA 分离编译、输出目录等）
set_target_properties(gbn_cuda PROPERTIES
    CUDA_SEPARABLE_COMPILATION ON  # 启用 CUDA 分离编译（提升编译速度）
    CUDA_RESOLVE_DEVICE_SYMBOLS ON # 解析设备端符号（跨文件核函数调用）
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin # 统一输出到 build/bin
    # 【新增】确保头文件在 IDE 中可见（可选，但提升开发体验）
    VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)

# ##############################################################################
# 第二步：依赖项配置（整合所有依赖，重点适配你的 OpenCV 路径）
# ##############################################################################
# 1. 系统数学库（Ubuntu 下默认包含 libm，检测确保存在）
find_library(MATH_LIB m)
if(NOT MATH_LIB)
    message(FATAL_ERROR "System math library (libm) not found! Required for GBN calculations.")
endif()

# 2. 可选：OpenMP 支持（多CPU辅助计算，如功率谱验证）
option(GBN_ENABLE_OPENMP "Enable OpenMP for CPU-side parallelism" OFF)
if(GBN_ENABLE_OPENMP)
    find_package(OpenMP REQUIRED)
    if(OpenMP_FOUND)
        set(GBN_LINK_LIBS ${GBN_LINK_LIBS} OpenMP::OpenMP_CXX)
        message(STATUS "OpenMP enabled for CPU parallelism")
    endif()
endif()

# 3. 核心：OpenCV 配置（适配你的源码编译路径 /home/xu-home/opencv/build）
# 【重要】快照功能依赖 OpenCV 进行图像生成与可视化，确保此选项开启
option(GBN_ENABLE_OPENCV "Enable OpenCV for C++ visualization (points/spectrum)" ON)
if(GBN_ENABLE_OPENCV)
    # 关键：指定你的 OpenCV 源码编译 build 目录（含 OpenCVConfig.cmake）
    set(OpenCV_DIR "/home/xu-home/opencv/build")
    
    # 基于配置文件查找 OpenCV（自动获取头文件、库文件路径）
    find_package(OpenCV REQUIRED)
    
    if(OpenCV_FOUND)
        # 输出 OpenCV 配置信息（便于调试确认）
        message(STATUS "=============================================")
        message(STATUS "OpenCV Config Success (Source Compiled)")
        message(STATUS "OpenCV Version: ${OpenCV_VERSION}")
        message(STATUS "OpenCV Include Dirs: ${OpenCV_INCLUDE_DIRS}")
        message(STATUS "OpenCV Linked Libs: ${OpenCV_LIBS}")
        message(STATUS "=============================================")
        
        # 关联 OpenCV 头文件（仅 gbn_cuda 目标可访问，避免全局污染）
        target_include_directories(gbn_cuda PRIVATE ${OpenCV_INCLUDE_DIRS})
        # 关联 OpenCV 库文件（添加到链接列表）
        set(GBN_LINK_LIBS ${GBN_LINK_LIBS} ${OpenCV_LIBS})
    else()
        # 极端情况：配置文件查找失败，手动指定 OpenCV 路径（基于你的路径推导）
        message(WARNING "OpenCV config file not found! Fallback to manual path config.")
        
        # 手动指定 OpenCV 头文件目录（适配源码编译的默认结构）
        set(OpenCV_INCLUDE_DIRS 
            "/home/xu-home/opencv/build/include"          # 主头文件目录
            "/home/xu-home/opencv/build/include/opencv4"  # opencv2 子目录（4.x 版本必需）
        )
        
        # 手动指定 OpenCV 库目录（build 下的 lib 文件夹）
        set(OpenCV_LIB_DIR "/home/xu-home/opencv/build/lib")
        
        # 手动指定需链接的 OpenCV 库（基于可视化需求，避免冗余）
        set(OpenCV_LIBS 
            ${OpenCV_LIB_DIR}/libopencv_core.so        # 核心库（必选）
            ${OpenCV_LIB_DIR}/libopencv_highgui.so     # 窗口显示库（可视化必选）
            ${OpenCV_LIB_DIR}/libopencv_imgproc.so     # 绘图/点集显示库（必选）
            ${OpenCV_LIB_DIR}/libopencv_imgcodecs.so   # 【新增】快照功能需图像读写（PNG/JPG）
        )

        # 验证手动路径有效性（避免路径错误导致编译失败）
        foreach(dir ${OpenCV_INCLUDE_DIRS})
            if(NOT EXISTS ${dir})
                message(FATAL_ERROR "OpenCV include directory missing: ${dir}")
            endif()
        endforeach()
        foreach(lib ${OpenCV_LIBS})
            if(NOT EXISTS ${lib})
                message(FATAL_ERROR "OpenCV library missing: ${lib}")
            endif()
        endforeach()

        # 手动关联头文件和库
        target_include_directories(gbn_cuda PRIVATE ${OpenCV_INCLUDE_DIRS})
        link_directories(${OpenCV_LIB_DIR})
        set(GBN_LINK_LIBS ${GBN_LINK_LIBS} ${OpenCV_LIBS})
    endif()
else()
    # 【新增】若关闭 OpenCV，快照功能无法使用，抛出警告
    message(WARNING "GBN_ENABLE_OPENCV is OFF! Snapshot function (gbn_snapshot_cuda.cuh) will not work.")
endif()

# Cairo 库配置（用于 PDF/EPS 矢量图生成，依赖 savePDF/saveRadialPowerSpectrum 功能）
# 选项说明：开启后才能生成 PDF/EPS 格式快照，关闭则仅支持 TXT/PNG
option(GBN_ENABLE_CAIRO "Enable Cairo for PDF/EPS vector snapshot (required for savePDF/saveRadialPowerSpectrum)" ON)
if(GBN_ENABLE_CAIRO)
    # -------------------------- 子步骤1：查找 Cairo 库（优先系统默认路径） --------------------------
    # 尝试用 CMake 内置模块查找（Linux/macOS 系统默认路径，如 /usr/include、/usr/lib）
    find_package(PkgConfig REQUIRED)  # 依赖 pkg-config 工具（Linux 系统通常预装，Ubuntu 可通过 sudo apt install pkg-config 安装）
    pkg_check_modules(CAIRO REQUIRED cairo)  # 通过 pkg-config 查找 Cairo 配置
    
    # 检查查找结果：若系统默认路径未找到（如手动安装的 Cairo），则手动指定路径
    if(CAIRO_FOUND)
        # 系统路径查找成功：输出配置信息（便于调试）
        message(STATUS "=============================================")
        message(STATUS "Cairo Config Success (System Default Path)")
        message(STATUS "Cairo Version: ${CAIRO_VERSION}")
        message(STATUS "Cairo Include Dirs: ${CAIRO_INCLUDE_DIRS}")
        message(STATUS "Cairo Linked Libs: ${CAIRO_LIBRARIES}")
        message(STATUS "Cairo Lib Dirs: ${CAIRO_LIBRARY_DIRS}")
        message(STATUS "=============================================")
    else()
        # 系统路径查找失败：手动指定 Cairo 路径（适配手动安装场景，如 Windows 或 Linux 自定义路径）
        message(WARNING "Cairo not found in system path! Fallback to manual config.")
        
        # -------------------------- 手动路径配置（根据你的 Cairo 安装路径修改） --------------------------
        # 示例1：Linux 手动安装路径（如你将 Cairo 安装到 /home/xu-home/cairo）
        set(CAIRO_INCLUDE_DIRS "/home/xu-home/cairo/include")  # Cairo 头文件目录（需包含 cairo/ 子目录，即 /home/xu-home/cairo/include/cairo/cairo.h）
        set(CAIRO_LIBRARY_DIRS "/home/xu-home/cairo/lib")      # Cairo 库文件目录（包含 libcairo.so 或 libcairo.a）
        set(CAIRO_LIBRARIES "cairo")                           # 库名（Linux 为 libcairo.so → 简写为 cairo；Windows 为 cairo.lib → 简写为 cairo）
        
        # 示例2：Windows 手动安装路径（若后续切换到 Windows，可替换为以下路径）
        # set(CAIRO_INCLUDE_DIRS "D:/Cairo/include")
        # set(CAIRO_LIBRARY_DIRS "D:/Cairo/lib")
        # set(CAIRO_LIBRARIES "cairo")
        
        # -------------------------- 子步骤2：验证手动路径有效性（避免路径错误导致编译失败） --------------------------
        # 检查头文件目录是否存在（必须包含 cairo/cairo.h）
        foreach(dir ${CAIRO_INCLUDE_DIRS})
            if(NOT EXISTS "${dir}/cairo/cairo.h")
                message(FATAL_ERROR "Cairo header missing: ${dir}/cairo/cairo.h (check CAIRO_INCLUDE_DIRS)")
            endif()
        endforeach()
        
        # 检查库文件目录是否存在（必须包含对应的库文件）
        if(NOT EXISTS ${CAIRO_LIBRARY_DIRS})
            message(FATAL_ERROR "Cairo library directory missing: ${CAIRO_LIBRARY_DIRS} (check CAIRO_LIBRARY_DIRS)")
        endif()
        
        # 输出手动配置信息
        message(STATUS "=============================================")
        message(STATUS "Cairo Config Success (Manual Path)")
        message(STATUS "Cairo Include Dirs: ${CAIRO_INCLUDE_DIRS}")
        message(STATUS "Cairo Lib Dirs: ${CAIRO_LIBRARY_DIRS}")
        message(STATUS "Cairo Linked Libs: ${CAIRO_LIBRARIES}")
        message(STATUS "=============================================")
    endif()
    
    # -------------------------- 子步骤3：将 Cairo 配置关联到 gbn_cuda 目标 --------------------------
    # 1. 关联头文件：让编译器找到 cairo/cairo.h
    target_include_directories(gbn_cuda PRIVATE ${CAIRO_INCLUDE_DIRS})
    
    # 2. 关联库文件路径：让链接器找到 Cairo 库
    link_directories(${CAIRO_LIBRARY_DIRS})
    
    # 3. 添加链接依赖：将 Cairo 库链接到 gbn_cuda 目标
    set(GBN_LINK_LIBS ${GBN_LINK_LIBS} ${CAIRO_LIBRARIES})
    
    # 4. 传递编译宏：让源码知道已启用 Cairo（可选，可在源码中用 #ifdef GBN_ENABLE_CAIRO 控制功能）
    target_compile_definitions(gbn_cuda PRIVATE GBN_ENABLE_CAIRO=1)
else()
    # 若关闭 Cairo，提示功能限制
    message(WARNING "GBN_ENABLE_CAIRO is OFF! PDF/EPS snapshot functions (savePDF/saveRadialPowerSpectrum) will not work.")
    target_compile_definitions(gbn_cuda PRIVATE GBN_ENABLE_CAIRO=0)
endif()

# 4. 可选：Python 可视化依赖
option(GBN_ENABLE_VISUALIZATION "Enable Python-based visualization (matplotlib/numpy)" OFF)
if(GBN_ENABLE_VISUALIZATION)
    find_package(Python3 COMPONENTS Interpreter Development)
    if(Python3_FOUND)
        execute_process(
            COMMAND ${Python3_EXECUTABLE} -c "import numpy; import matplotlib"
            RESULT_VARIABLE PY_DEP_CHECK
            ERROR_QUIET
        )
        if(PY_DEP_CHECK EQUAL 0)
            message(STATUS "Python visualization dependencies (numpy/matplotlib) found")
            configure_file(
                ${CMAKE_SOURCE_DIR}/scripts/visualize_gbn.py
                ${CMAKE_BINARY_DIR}/visualize_gbn.py
                COPYONLY
            )
        else()
            message(WARNING "Python visualization dependencies missing! Disabling.")
            set(GBN_ENABLE_VISUALIZATION OFF)
        endif()
    else()
        message(WARNING "Python3 not found! Disabling visualization.")
        set(GBN_ENABLE_VISUALIZATION OFF)
    endif()
endif()

# ##############################################################################
# 将 CMake 变量传递到源码（通过编译宏 -DXXX=XXX）
# 格式：target_compile_definitions(目标 PRIVATE -D宏名=宏值)
# ##############################################################################
target_compile_definitions(gbn_cuda PRIVATE
    # 传递数值型参数（点数量、维度、sigma等）
    GBN_NUM_POINTS=${GBN_NUM_POINTS}
    GBN_DIMENSIONS=${GBN_DIMENSIONS}
    GBN_2D_WIDTH=${GBN_2D_WIDTH}
    GBN_2D_HEIGHT=${GBN_2D_HEIGHT}
    GBN_SIGMA=${GBN_SIGMA}
    GBN_LEARNING_RATE=${GBN_LEARNING_RATE}
    GBN_MAX_ITERATIONS=${GBN_MAX_ITERATIONS}
    GBN_POWER_BINS=${GBN_POWER_BINS}
    
    # 传递路径参数（快照路径，需用双引号包裹字符串）
    GBN_SNAPSHOT_PATH="${GBN_SNAPSHOT_PATH}"
    
    # 传递布尔型参数（禁用环形域：1=禁用，0=启用）
    $<$<BOOL:${GBN_DISABLE_TOROIDAL}>:GBN_DISABLE_TOROIDAL=1>
    $<$<NOT:$<BOOL:${GBN_DISABLE_TOROIDAL}>>:GBN_DISABLE_TOROIDAL=0>
)

# ##############################################################################
# 第三步：编译选项与最终链接（关联所有依赖）
# ##############################################################################
# 应用编译选项（区分 C++ 和 CUDA 编译）
target_compile_options(gbn_cuda PRIVATE
    $<$<COMPILE_LANGUAGE:CXX>:${GBN_COMPILE_FLAGS}>
    $<$<COMPILE_LANGUAGE:CUDA>:
        ${GBN_COMPILE_FLAGS}
        --expt-relaxed-constexpr  # 允许 CUDA 中 constexpr 语法放松限制
        --use_fast_math           # 启用 CUDA 快速数学库（提升计算效率）
        --expt-extended-lambda    # 【新增】若快照头文件用 lambda，需开启此选项（可选）
    >
)

# 关联项目自身头文件 + CUDA 头文件
target_include_directories(gbn_cuda PRIVATE
    ${CMAKE_SOURCE_DIR}/include                      # 项目自定义头文件目录
    ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}        # CUDA 工具集头文件目录
)

# 链接所有依赖库（数学库 + OpenMP + OpenCV）
target_link_libraries(gbn_cuda PRIVATE
    ${MATH_LIB}                # 系统数学库
    ${GBN_LINK_LIBS}           # 整合的链接列表（含 OpenMP、OpenCV）
)

# ##############################################################################
# 第四步：安装与部署配置
# 安装快照头文件到系统目录，便于后续复用
# ##############################################################################
install(TARGETS gbn_cuda
    RUNTIME DESTINATION bin                # 可执行文件安装到 /usr/local/bin
    LIBRARY DESTINATION lib                # 动态库安装路径（后续拆分库时用）
    ARCHIVE DESTINATION lib                # 静态库安装路径（后续拆分库时用）
    INCLUDES DESTINATION include           # 头文件安装到 /usr/local/include
)

install(FILES ${GBN_HEADERS}
    DESTINATION include
    COMPONENT Devel
    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ # 设置合理权限
)

if(GBN_ENABLE_VISUALIZATION)
    install(FILES ${CMAKE_SOURCE_DIR}/scripts/visualize_gbn.py
        DESTINATION bin
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
                    GROUP_EXECUTE GROUP_READ
                    WORLD_EXECUTE WORLD_READ
    )
endif()

# ##############################################################################
# 第五步：构建信息输出（便于确认配置状态）
# ##############################################################################
message(STATUS "=============================================")
message(STATUS "高斯蓝噪声采样 (GBN) CUDA 构建配置 | Gaussian Blue Noise (GBN) CUDA Build Config")
message(STATUS "=============================================")
message(STATUS "项目版本 | Project Version: ${PROJECT_VERSION}")
message(STATUS "构建类型 | Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS "C++ 编译器 | C++ Compiler: ${CMAKE_CXX_COMPILER} (v${CMAKE_CXX_COMPILER_VERSION})")
message(STATUS "CUDA 编译器 | CUDA Compiler: ${CMAKE_CUDA_COMPILER} (v${CMAKE_CUDA_COMPILER_VERSION})")
message(STATUS "CUDA 架构 | CUDA Architectures: ${CMAKE_CUDA_ARCHITECTURES}")
message(STATUS "---------------------------------------------")
# 【新增】CMake 命令行参数配置（与 main.cpp 选项对应）
message(STATUS "GBN 核心参数配置 | GBN Core Config ")
message(STATUS "点数量 (-n) | Num Points: ${GBN_NUM_POINTS}")
message(STATUS "维度 (-d) | Dimensions: ${GBN_DIMENSIONS}")
message(STATUS "2D 域宽 (-w) | 2D Width: ${GBN_2D_WIDTH}")
message(STATUS "2D 域高 (-h) | 2D Height: ${GBN_2D_HEIGHT}")
message(STATUS "高斯核带宽 (-s) | Sigma: ${GBN_SIGMA}")
message(STATUS "学习率 (-lr) | Learning Rate: ${GBN_LEARNING_RATE}")
message(STATUS "最大迭代次数 (-i) | Max Iterations: ${GBN_MAX_ITERATIONS}")
message(STATUS "环形域禁用 (-t) | Disable Toroidal: ${GBN_DISABLE_TOROIDAL}")
message(STATUS "快照路径 (-snap) | Snapshot Path: ${GBN_SNAPSHOT_PATH}")
message(STATUS "功率谱区间数 (-bins) | Power Bins: ${GBN_POWER_BINS}")
message(STATUS "---------------------------------------------")
message(STATUS "OpenMP 支持 | OpenMP Support: ${GBN_ENABLE_OPENMP}")
message(STATUS "OpenCV 支持 | OpenCV Support: ${GBN_ENABLE_OPENCV}")
message(STATUS "Cairo 支持 | Cairo Support: ${GBN_ENABLE_CAIRO}") 
message(STATUS "Python 可视化 | Python Visualization: ${GBN_ENABLE_VISUALIZATION}")
message(STATUS "OpenCV 目录 | OpenCV Directory: ${OpenCV_DIR}")
message(STATUS "安装前缀 | Install Prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "=============================================")